年化收益577倍的量化策略,没有未来函数,却有这个致命Bug
对的,你没有看错,不是累计收益,是年化收益,收益不是577%,而是577倍,也就是57700%。
这个量化策略是今天下午某位群友兄dei发给我的,说这个策略收益逆天,还拍胸脯保证这个策略没有未来函数。
我心里也纳闷,真的假的啊,将信将疑先打开源码䁖一䁖,快速地看一下。
在初始化函数前5行代码里面就找到了【set_option("avoid_future_data", True)】,这个是回测的全局设置函数,它开启了【防未来函数】功能,就是系统会自动限定你看不到当前时刻之后的数据,除非你调用的不是系统的数据获取函数。
看到这里觉得有戏啊,连这个防止未来函数的功能都开启了。
接着跳到关键选股函数,截止日期用的是【context.previous_date】,用的是上一个交易日(含)之前的数据,也是正常的防未来函数的取数方式,更加坚定了自己的看法。
先跑个回测看看吧,分钟级的回测比较慢,先看一个近三年的吧,神奇的事情发生了,我一开始只知道收益率逆天,想不到可以逆天到页面都无法正常显示,这收益率是高到模糊啊。
PS:不信邪的群友,可以在社群量化兵器库原路径中自取策略源码,按分钟回测超过3年时间。
面对这种情况,我也是大姑娘上花轿——头一回,只好把回测时间缩短,再来跑一遍,终于可以正常显示了。
不会吧,年化收益57734.53%,夏普率748.27,什么西蒙斯、索罗斯、巴菲特在这个收益率面前都是渣渣。
回测这么逆天,以我多年长期踩坑的经验来看,这种“妖策略”必定有古怪,没有未来函数这种阎王,也可能有难缠的小鬼。最直观地,先从最近持仓开始看起。
不看不知道,一看果然有猫腻,最近2022年7月12日还买进了山*路桥(00**55.SH)。
我的天爷啊,这种一字板涨停的股票都买得进,那还有什么事情做不出来,还是静下心来仔细看策略源码。
细读之下发现,这TM是一个打板策略,策略核心要点如下:
(1)在每天开盘前选择上一个交易日涨停,并且上一个交易日创了近3个月的收盘价新高的股票作为选股池,但剔除创业板、科创板和ST股。
(2)按分钟回测,在大盘行情向好时,买入股票池中涨幅超过9.5%的股票,最多持有N支股票,买满N支不再买入。
(3)在收盘前的固定时间点,卖出不再涨停的可卖出股票(今天之前买入的),如果涨停,则继续持有。
关键是第二条中【买入股票池中涨幅超过9.5%的股票】,这是说股票涨幅超过9.5%就买入,但没有说涨停了就不买了,而且回测时都能成交,这到底是为什么呢?
最后终于找到了元凶,那就是在全局设置时,将【match_by_signal】功能设置成了True,也就是强制撮合,发出委托时将不对委托价格和成交数量进行任何检查而直接成交。
这就解释了为啥能买入一字板涨停的股票,因为你敢挂单,系统就敢给你成交,让你吃到后面连涨的收益,一天一个涨停板,咱们就可买地球(在回测中或梦里)。
解除了心中的困惑,世界终于宁静了,回测虽然没有未来函数,但是实盘铁定无法复现,我还是哪凉快哪呆着去吧。
但往后想一步,细思极恐,如果有居心不良的人利用这个强制撮合功能,生成一些漂亮的收益曲线卖策略,并且承诺其中没有未来函数,估计会有不少缺乏经验和毒打的萌新上当。
萌新啊,你可当点儿心呐~~~
END
如果对本文有疑惑,或是想聊聊
亦或是围观朋友圈当点赞之交
点我,让我们一路同行
吃瓜吐槽写代码
(微信号:iquantman)
添加好友后,私信『666』
送你一些量化小福利